/*
 * Board.java
 *
 * Created on 2005/01/21 +0900
 *
 * $Revision: 40 $
 * $Date: 2008-10-26 13:45:24 +0000 (Sun, 26 Oct 2008) $
 */

package org.gikolet.bbs.data;

import org.gikolet.framework.util.Assert;

/**
 * BBSにおいて板を表すクラス。
 *
 * @author Tetsutaro (latest modification by $Author: tetsutaro.ss $)
 * @version $Revision: 40 $ $Date: 2008-10-26 13:45:24 +0000 (Sun, 26 Oct 2008) $
 */
public class Board {
    private Bbs bbs;

    /**
     * 板を示すBbs内で一意なキー。
     */
    private String key;

    /**
     * 板名。
     */
    private String name;

    /**
     * Bbsのハッシュコードのキャッシュ。
     */
    private int bbsHashCodeCache = 0;

    /**
     * ハッシュコードのキャッシュ。
     */
    private int hashCodeCache = 0;

    /**
     * 指定されたBoardでBoardを作成する。
     *
     * @param key
     *            板を示すBbs内で一意なキー
     * @param name
     *            板名
     */
    public Board(Board board) {
	this(board.bbs, board.key, board.name);
    }

    /**
     * 指定されたキー、板名で新しいBbsBoardを作成する。
     *
     * @param key
     *            板を示すBbs内で一意なキー
     * @param name
     *            板名
     */
    public Board(Bbs bbs, String key, String name) {
	Assert.isNotNull(bbs);
	Assert.isNotNullAndEmpty(key);
	Assert.isNotNullAndEmpty(name);

	this.bbs = bbs;
	this.key = key;
	this.name = name;
    }

    /**
     * 板を示すBbs内で一意なキーを返す。
     *
     * @return 板を示すBbs内で一意なキー
     */
    public String getKey() {
	return this.key;
    }

    /**
     * 板を示すBbs内で一意なキーを設定する。
     *
     * @param key
     *            板を示すBbs内で一意なキー
     */
    public void setKey(String key) {
	this.key = key;
    }

    /**
     * 板名を返す。
     *
     * @return 板名
     */
    public String getName() {
	return this.name;
    }

    /**
     * 板名を設定する。
     *
     * @param name
     *            板名
     */
    public void setName(String name) {
	this.name = name;
    }

    /**
     * オブジェクトのハッシュコード値を返します。これはキーの{@link String#hashCode()}と同じ値です。
     *
     * @return このオブジェクトのハッシュコード値
     */
    public int hashCode() {
	int bbsHashCode = this.bbs.hashCode();

	if (bbsHashCode != this.bbsHashCodeCache || this.hashCodeCache == 0) {
	    this.hashCodeCache = (bbsHashCode + ":" + this.key).hashCode();
	}

	return this.hashCodeCache;
    }

    /**
     * この板と指定されたオブジェクトを比較する
     *
     * @param obj
     *            比較するオブジェクト
     */
    public boolean equals(Object obj) {
	if (obj instanceof Board) {
	    return equals((Board) obj);
	}
	return false;
    }

    /**
     * この板と指定された板を比較する
     *
     * @param obj
     *            比較する板
     */
    public boolean equals(Board board) {
	if (board == null) {
	    return false;
	}
	return this.bbs.equals(board.bbs) && this.key.equals(board.key);
    }

    /**
     * この板の文字列表現を返す
     *
     * @return この板の文字列表現
     */
    public String toString() {
	return "key=" + this.key + ", name=" + this.name;
    }
}
